package com.itheima.Service.Servicelmpl;

import com.itheima.Service.OrderService;
import com.itheima.common.constant.MessageConstant;
import com.itheima.common.exception.OrderException;
import com.itheima.mapper.MemberMapper;
import com.itheima.mapper.OrderMapper;
import com.itheima.mapper.OrderSetMapper;
import com.itheima.pojo.*;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.time.LocalDate;

@Service
public class OrderServiceLmpl implements OrderService {
    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private OrderSetMapper  orderSetMapper;
    @Autowired
    private RedisTemplate redisTemplate;
    /**
     * 查询预约信息
     * @param id
     * @return
     */
    public OrderVO listr(Integer id) {
         OrderVO orderVO=orderMapper.list(id);

         return orderVO;
    }
    /**
     * 要求如下：
     *
     * 1. 验证码保存到redis，保存5分钟，超时自动删除。
     *
     * 2. 校验用户输入的验证码是否正确。
     *
     * 3. 预约日期的预约人数没有设置的话不能预约。
     *
     * 4. 预约日期是否已经约满，如果已经约满则无法预约。
     *
     * 5. 不能重复预约（同一个用户在同一天预约了同一个套餐）。
     *
     * 6. 当前用户不是会员，需要自动完成注册。
     *
     * 7. 更新已预约人数
     */
    /**
     * 提交预约
     * @param orderDTO
     */
    public Integer order(OrderDTO orderDTO) {
        //判断这个用户是否是会员，不是会员完成自动注册
        String name = orderDTO.getName();
        String sex = orderDTO.getSex();
        Member member =memberMapper.list(name,sex);
        Integer id = member.getId();
        if (member==null){
            memberMapper.insert(orderDTO); //自动注册会员
        }
        //校验验证码
        String key="telephonecode";
        if (!orderDTO.getValidateCode().equals(redisTemplate.opsForValue().get(key))){
            throw new OrderException(MessageConstant.VALIDATECODE_ERROR);
        }

        //预约日期的预约人数没有设置的话不能预约
        LocalDate orderDate = orderDTO.getOrderDate();
        OrderSetting orderSetting =orderSetMapper.list(orderDate);
        if (orderSetting.getNumber()==0&orderSetting.getReservations()==orderSetting.getNumber()){
            throw new OrderException(MessageConstant.SELECTED_DATE_CANNOT_ORDER);
        }
        // 不能重复预约（同一个用户在同一天预约了同一个套餐）
         Order order=orderMapper.listed(orderDTO);
        if (order!=null){
            throw new OrderException(MessageConstant.HAS_ORDERED);
        }
        //更新预约人数
        orderSetMapper.update(orderDTO.getOrderDate());
        //插入预约表
        Order order1 = new Order();
        order1.setOrderStatus(Order.ORDERSTATUS_NO);
        order1.setMemberId(id);
        //order1.setOrderDate(orderDTO.getOrderDate());
        order1.setOrderType("微信预约");
        BeanUtils.copyProperties(orderDTO,order1);
        orderMapper.insert(order1);
        Integer id1 = order1.getId();
        return id1;
    }
}
